package com.freemalll.merchant.utils;

import com.freemalll.common.core.exception.BusinessException;
import com.freemalll.merchant.domain.dto.merchantParameters.ImportParamDto;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.DateUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Excel导入并解析为树形结构DTO的工具类
 */
@Component
public class ExcelToTreeParserUtil {


    /**
     * 从MultipartFile解析Excel文件并转换为树形结构DTO列表
     *
     * @param file Excel文件
     * @return 树形结构DTO列表
     * @throws IOException 如果文件读取失败
     */
    public List<ImportParamDto> parseExcelToTree(MultipartFile file) throws IOException {
        try (InputStream inputStream = file.getInputStream();
             Workbook workbook = WorkbookFactory.create(inputStream)) {

            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
            return parseSheetToTree(sheet);
        }
    }

    /**
     * 解析单个工作表为树形结构DTO列表
     *
     * @param sheet Excel工作表
     * @return 树形结构DTO列表
     */
    private List<ImportParamDto> parseSheetToTree(Sheet sheet) {
        List<ImportParamDto> rootNodes = new ArrayList<>();
        Map<String, ImportParamDto> nodeMap = new HashMap<>();

        for (Row row : sheet) {
            if (row.getRowNum() == 0) continue; // 跳过标题行

            // 读取各级参数
            String level1Key = getCellValue(row.getCell(0));
            String level1Name = getCellValue(row.getCell(1));
            String level2Key = getCellValue(row.getCell(2));
            String level2Name = getCellValue(row.getCell(3));
            String level3Key = getCellValue(row.getCell(4));
            String level3Name = getCellValue(row.getCell(5));
            String level4Key = getCellValue(row.getCell(6));
            String level4Name = getCellValue(row.getCell(7));
            String level5Key = getCellValue(row.getCell(8));
            String level5Name = getCellValue(row.getCell(9));
            String level6Key = getCellValue(row.getCell(10));
            String level6Name = getCellValue(row.getCell(11));

            // 检查是否超过5级
            if (isValidNode(level6Key, level6Name)) {
                throw BusinessException.businessOther("Excel中的层级结构不能超过5级");
            }

            // 处理各级节点
            ImportParamDto currentNode = null;

            // 处理一级节点
            if (isValidNode(level1Key, level1Name)) {
                currentNode = getOrCreateNode(level1Key, level1Name, null, nodeMap, rootNodes);
            }

            // 处理二级节点
            if (isValidNode(level2Key, level2Name) && currentNode != null) {
                currentNode = getOrCreateNode(level2Key, level2Name, currentNode, nodeMap, null);
            }

            // 处理三级节点
            if (isValidNode(level3Key, level3Name) && currentNode != null) {
                currentNode = getOrCreateNode(level3Key, level3Name, currentNode, nodeMap, null);
            }

            // 处理四级节点
            if (isValidNode(level4Key, level4Name) && currentNode != null) {
                currentNode = getOrCreateNode(level4Key, level4Name, currentNode, nodeMap, null);
            }

            // 处理五级节点
            if (isValidNode(level5Key, level5Name) && currentNode != null) {
                currentNode = getOrCreateNode(level5Key, level5Name, currentNode, nodeMap, null);
            }
        }

        return rootNodes;
    }

    /**
     * 检查节点是否有效
     */
    private boolean isValidNode(String key, String name) {
        return key != null && !key.isEmpty() && name != null && !name.isEmpty();
    }

    /**
     * 获取或创建节点
     */
    private ImportParamDto getOrCreateNode(String key, String name, ImportParamDto parent,
                                           Map<String, ImportParamDto> nodeMap, List<ImportParamDto> rootNodes) {
        // 检查是否已存在该节点
        ImportParamDto node = nodeMap.get(key);

        if (node == null) {
            // 创建新节点
            node = new ImportParamDto();
            node.setParamKey(key);
            node.setParamName(name);

            // 将节点添加到父节点的子节点列表中
            if (parent != null) {
                parent.getChildren().add(node);
            } else if (rootNodes != null) {
                // 如果没有父节点且提供了根节点列表，则添加到根节点列表
                rootNodes.add(node);
            }

            // 将节点添加到映射中
            nodeMap.put(key, node);
        } else {
            // 如果节点已存在，更新名称（如果名称不同）
            if (!node.getParamName().equals(name)) {
                node.setParamName(name);
            }

            // 如果节点已存在但父节点不同，需要处理这种情况
            if (parent != null && !parent.getChildren().contains(node)) {
                parent.getChildren().add(node);
            }
        }

        return node;
    }

    /**
     * 获取单元格的值
     */
    private String getCellValue(Cell cell) {
        if (cell == null) return null;

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue().trim();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue().toString();
                } else {
                    // 处理数字类型，避免科学计数法
                    double numericValue = cell.getNumericCellValue();
                    if (numericValue == (long) numericValue) {
                        return String.valueOf((long) numericValue);
                    } else {
                        return String.valueOf(numericValue);
                    }
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            default:
                return null;
        }
    }

}
